package com.yixq.soa.service.web.utils;

import org.apache.commons.lang3.StringUtils;

import com.yixq.soa.service.web.annotation.DataValid;
import com.yixq.soa.service.web.em.RegexType;
import com.github.miemiedev.mybatis.paginator.domain.Order;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

import java.io.Serializable;

/**
 * 用于接收和转换分页参数,可以调用 getPageBounds 方法来获得 PageBounds
 * @author kyler.tang
 *
 */
@ApiModel(description = "分页请求参数")
public class PageParam implements Serializable {
	private static final long serialVersionUID = 1L;

	@DataValid(description = "请求记录数", maxLength = 3, nullable = false, regexType = RegexType.NUMBER)
	@ApiModelProperty(value = "请求记录数(长度3)",required=true,dataType = "int")
	private String limit;//	分页参数：请求记录数	number

	@DataValid(description = "页码", maxLength = 4, nullable = false, regexType = RegexType.NUMBER)
	@ApiModelProperty(value = "页码(长度4)",required=true,dataType = "int")
	private String page;//	分页参数：页码	number	
	
	public static int DEFAULT_LIMIT = 25;
	
	public String getLimit() {
		return limit;
	}
	
	public void setLimit(String limit) {
		this.limit = limit;
	}
	
	public String getPage() {
		return page;
	}
	
	public void setPage(String page) {
		this.page = page;
	}

	
	/**
	 * 以默认信息构造一个分页描述,用于传递给DAO接口进行分页处理.
	 * @return
	 */
	public PageBounds getPageBounds(){
		return getPageBounds(DEFAULT_LIMIT);
	}
	
	public PageBounds getPageBoundsNotTotal(){

		return getPageBoundsNotTotal(null);
	}
	
	public PageBounds getPageBoundsNotTotal(Integer limit){
		if(limit == null){
			limit = DEFAULT_LIMIT;
		}
		PageBounds pb= getPageBounds(limit);
		pb.setContainsTotalCount(false);
		
		return pb;
	}
	
	/**
	 * 获取一个包含排序属性的分页描述对象
	 * @param orderSegment 例如:"id.asc,code.desc" (使用,号分隔多个排序,使用.号分隔字段名和排序规则)
	 * @return
	 */
	public PageBounds getPageBoundsWhitOrderBy(String orderSegment){
		PageBounds  pb= getPageBounds();
		pb.setOrders(Order.formString(orderSegment));
		return pb;
	}
	
	/**
	 * 获取一个包含排序属性的分页描述对象
	 * @param limit 缺省每页记录数(只有在前台没有传输分页记录数时生效)
	 * @param orderSegment 例如:"id.asc,code.desc" (使用,号分隔多个排序,使用.号分隔字段名和排序规则)
	 * @return
	 */
	public PageBounds getPageBoundsWhitOrderBy(int limit,String orderSegment){
		PageBounds  pb= getPageBounds(limit);
		pb.setOrders(Order.formString(orderSegment));
		return pb;
	}
	
	/**
	 * 获取一个分页描述类,用于传递给DAO接口进行分页处理.
	 * @param default_limit 代替默认的DEFAULT_LIMIT,如果有传递limit将不会采用该参数的值.
	 * @return
	 */
	public PageBounds getPageBounds(int default_limit){
		PageBounds bounds = null;
		int cpage = 1;
		int climit = default_limit;
		if(StringUtils.isNotBlank(page) && StringUtils.isNumeric(page)){
			cpage = Math.max(Integer.parseInt(page), cpage);
			
		}
		
		if(StringUtils.isNotBlank(limit) && StringUtils.isNumeric(limit)){
			climit = Math.max(Integer.parseInt(limit), 1);
			
		}
		
		bounds = new PageBounds(cpage,climit,true);
		
		return bounds;
	}
	
	
}
